"""
Widgets for various HTML5 input types.
"""

from .core import Input

__all__ = (
    "ColorInput",
    "DateInput",
    "DateTimeInput",
    "DateTimeLocalInput",
    "EmailInput",
    "MonthInput",
    "NumberInput",
    "RangeInput",
    "SearchInput",
    "TelInput",
    "TimeInput",
    "URLInput",
    "WeekInput",
)


class SearchInput(Input):
    """
    Renders an input with type "search".
    """

    input_type = "search"


class TelInput(Input):
    """
    Renders an input with type "tel".
    """

    input_type = "tel"


class URLInput(Input):
    """
    Renders an input with type "url".
    """

    input_type = "url"


class EmailInput(Input):
    """
    Renders an input with type "email".
    """

    input_type = "email"


class DateTimeInput(Input):
    """
    Renders an input with type "datetime".
    """

    input_type = "datetime"


class DateInput(Input):
    """
    Renders an input with type "date".
    """

    input_type = "date"


class MonthInput(Input):
    """
    Renders an input with type "month".
    """

    input_type = "month"


class WeekInput(Input):
    """
    Renders an input with type "week".
    """

    input_type = "week"


class TimeInput(Input):
    """
    Renders an input with type "time".
    """

    input_type = "time"


class DateTimeLocalInput(Input):
    """
    Renders an input with type "datetime-local".
    """

    input_type = "datetime-local"


class NumberInput(Input):
    """
    Renders an input with type "number".
    """

    input_type = "number"

    def __init__(self, step=None, min=None, max=None):
        self.step = step
        self.min = min
        self.max = max

    def __call__(self, field, **kwargs):
        if self.step is not None:
            kwargs.setdefault("step", self.step)
        if self.min is not None:
            kwargs.setdefault("min", self.min)
        if self.max is not None:
            kwargs.setdefault("max", self.max)
        return super(NumberInput, self).__call__(field, **kwargs)


class RangeInput(Input):
    """
    Renders an input with type "range".
    """

    input_type = "range"

    def __init__(self, step=None):
        self.step = step

    def __call__(self, field, **kwargs):
        if self.step is not None:
            kwargs.setdefault("step", self.step)
        return super(RangeInput, self).__call__(field, **kwargs)


class ColorInput(Input):
    """
    Renders an input with type "color".
    """

    input_type = "color"
